#pragma once
#include <iostream>
#include <string>

std::string opers="+-*/%";

enum{
    DivZero=1,
    ModZero,
    Unknown
};

class Task
{
public:
    Task(int x,int y,char op)
    :_data1(x)
    ,_data2(y)
    ,_oper(op)
    ,_result(0)
    ,_exitcode(0)
    {}

    void Run()
    {
        switch(_oper)
        {
            case '+':
                _result=_data1+_data2;
                break;
            case '-': 
                _result=_data1-_data2;
                break;
            case '*': 
                _result=_data1*_data2;
                break;
            case '/': 
                {
                    if(_data2==0)   _exitcode=DivZero;
                    else    _result=_data1/_data2;
                }
                break;
            case '%': 
                {
                    if(_data2==0)   _exitcode=ModZero;
                    else    _result=_data1%_data2;
                }
                break; 
            default:
            _exitcode=Unknown;
        }
    }

    std::string GetResult()
    {
        std::string r=std::to_string(_data1);
        r+=_oper;
        r+=std::to_string(_data2);
        r+='=';
        r+=std::to_string(_result);
        r+=" [code: ";
        r+=std::to_string(_exitcode);
        r+=']';
        return r;
    }

    void operator()()       //仿函数
    {
        Run();
    }

    std::string GetTask()
    {
        std::string r=std::to_string(_data1);
        r+=_oper;
        r+=std::to_string(_data2);
        r+="=?";
        return r;
    }
    ~Task()
    {} 
private:
    int _data1;              //两数据
    int _data2;
    char _oper;              //操作符

    int _result;             //结果
    int _exitcode;           //结果是否可靠
};